﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace JasRibbonApplicatie.Model
{
    class AanvraagModel: Model
    {
        public AanvraagModel()
        {
            Console.WriteLine("AanvraagModel Created");
        }
        public const int AANTAL_DAGEN_IN_WEEK = 7;

        public List<Aanvraag> GetAanvragen(List<Status> statusFilter)
        {
            var statfilt = (from sf in statusFilter
                            select sf.status_id);
            if (statusFilter.Count > 0)
            {
                return (from a in entities.Aanvraag
                        where statfilt.Contains(a.status_id)
                        select a).ToList();
            }
            else
            {
                return entities.Aanvraag.ToList();
            }
        }
        public List<Aanvraag> GetAanvragenByOphaalDate(DateTime date , List<Status> toeglatenStatussen)
        {
            var statussen = from s in toeglatenStatussen
                            select s.status_id;

            return (from aanvraag in entities.Aanvraag
                    where aanvraag.geplande_afhaling.Value.Year.Equals(date.Year)
                       && aanvraag.geplande_afhaling.Value.Month.Equals(date.Month)
                       && aanvraag.geplande_afhaling.Value.Day.Equals(date.Day)
                       && statussen.Contains(aanvraag.status.status_id)
                    select aanvraag).ToList();
        }
        public List<Aanvraag> GetAanvragenByOphaalDate(DateTime van, DateTime tot, List<Status> toeglatenStatussen)
        {
            var statussen = from s in toeglatenStatussen
                            select s.status_id;

            return (from aanvraag in entities.Aanvraag
                    where aanvraag.geplande_afhaling >= van
                       && aanvraag.geplande_afhaling < tot
                       && statussen.Contains(aanvraag.status.status_id)
                    select aanvraag).ToList();
        }
        public List<Aanvraag> GetAanvragenByInleverDate(DateTime date , List<Status> toeglatenStatussen)
        {
            var statussen = from s in toeglatenStatussen
                            select s.status_id;

            return (from aanvraag in entities.Aanvraag
                    where aanvraag.geplande_inlevering.Value.Year.Equals(date.Year)
                       && aanvraag.geplande_inlevering.Value.Month.Equals(date.Month)
                       && aanvraag.geplande_inlevering.Value.Day.Equals(date.Day)
                       && statussen.Contains(aanvraag.status.status_id)
                    select aanvraag).ToList();
        }
        public List<Aanvraag> GetAanvragenByInleverDate(DateTime van, DateTime tot, List<Status> toeglatenStatussen)
        {
            var statussen = from s in toeglatenStatussen
                            select s.status_id;

            return (from aanvraag in entities.Aanvraag
                    where aanvraag.geplande_inlevering >= van
                       && aanvraag.geplande_inlevering < tot
                       && statussen.Contains(aanvraag.status.status_id)
                    select aanvraag).ToList();
        }

        public Aanvraag GetAanvraagById(int Aanvraag_id)
        {
            var av = from a in entities.Aanvraag
                     where a.aanvraag_id == Aanvraag_id
                     select a;
            if (av.Count() > 0)
            {
                return av.First();
            }
            else
            {
                return null;
            }
        }

        public Evenement GetEvenementById(int id)
        {
            var evenementQuery = from ev in entities.Evenement
                                 where ev.evenement_id.Equals(id)
                                 select ev;
            if (evenementQuery.Count() > 0)
            {
                return evenementQuery.First<Evenement>();
            }
            else
            {
                return null;
            }
        }

        public void UpdateAanvraagStatus(int aanvraagId, Status status)
        {
            var query = from a in entities.Aanvraag
                        where a.aanvraag_id.Equals(aanvraagId)
                        select a;
            query.First().status_id = status.status_id;
            OpslaanWijzigingen();
        }

        public void AddOntlening(int aanvraagId, String streepjescode, int magazijnierIdAfhaling)
        {
            // alle nodige controles zijn gebeurd in OntleningsBeheerder, dus we gaan er hier van uit dat de invoer correct is...
            entities.Ontlening.AddObject(new Ontlening()
            {
                aanvraag_id = aanvraagId,
                magazijnier_id_afhaling = magazijnierIdAfhaling,
                streepjescode = streepjescode,
                tijdstip_afhaling = DateTime.Now,
                magazijnier_id_inlevering = 0,
                tijdstip_inlevering = DateTime.MinValue
            });
            //entities.SaveChanges(); // pas op het einde doen (1x naar de database schrijven)
        }

        public void UndoAddOntlening(int aanvraagId, String streepjescode)
        {
            var ontleningQuery = from ontlening in entities.Ontlening
                                 where ontlening.streepjescode.Equals(streepjescode)
                                 && (ontlening.aanvraag_id.Equals(aanvraagId))
                                 select ontlening;
            entities.Ontlening.DeleteObject(ontleningQuery.First());
        }
        // wordt vanuit gegaan dat alles OK is qua params
        public void BeeindigOntlening(int aanvraagId, String streepjescode, int magazijnierIdInlevering)
        {
            var ontleningQuery = from ontlening in entities.Ontlening
                                 where ontlening.streepjescode.Equals(streepjescode)
                                 && ontlening.aanvraag_id.Equals(aanvraagId)
                                 select ontlening;
            Ontlening entry = ontleningQuery.First();

            entry.magazijnier_id_inlevering = magazijnierIdInlevering;
            entry.tijdstip_inlevering = DateTime.Now;
        }

        public void UndoBeeindigingOntlening(int aanvraagId, String streepjescode)
        {
            var ontleningQuery = from ontlening in entities.Ontlening
                                 where ontlening.streepjescode.Equals(streepjescode)
                                 && ontlening.aanvraag_id.Equals(aanvraagId)
                                 select ontlening;
            Ontlening entry = ontleningQuery.First();
            entry.tijdstip_inlevering = DateTime.MinValue;
            entry.magazijnier_id_inlevering = 0;
        }

        public void SetAfhalenMagazijnier(int aanvraagId, int? magazijnier_id_afhaling)
        {
            var query = from a in entities.Aanvraag
                        where a.aanvraag_id.Equals(aanvraagId)
                        select a;
            query.First().magazijnier_id_afhaling = magazijnier_id_afhaling;
        }

        public void SetInleverenMagazijnier(int aanvraagId, int? magazijnier_id_inlevering)
        {
            var query = from a in entities.Aanvraag
                        where a.aanvraag_id.Equals(aanvraagId)
                        select a;
            query.First().magazijnier_id_inlevering = magazijnier_id_inlevering;
        }

        public void SetAfhalenTijd(int aanvraagId, DateTime geplande_afhaling)
        {
            var query = from a in entities.Aanvraag
                        where a.aanvraag_id.Equals(aanvraagId)
                        select a;
            query.First().geplande_afhaling = geplande_afhaling;
        }

        public void SetInleverenTijd(int aanvraagId, DateTime geplande_inlevering)
        {
            var query = from a in entities.Aanvraag
                        where a.aanvraag_id.Equals(aanvraagId)
                        select a;
            query.First().geplande_inlevering = geplande_inlevering;
        }

        public IQueryable<Status> GetAllStatussen()
        {
            return from s in entities.Status select s;
        }

        public Status getStatus(string p)
        {
            var statussen = from s in entities.Status
                            where s.status == p
                            select s;
            if (statussen.Count() > 0)
                return statussen.First();
            return null;
        }

        public int[] GetBetaaldagen(Aanvraag aanvraag)
        {
            //0 => weken & 1=>dagen
            var start = aanvraag.evenement.start;
            var eind = aanvraag.evenement.einde;
            TimeSpan t1 = eind.Subtract(start);
            int days = t1.Days + ((t1.Hours > 0 || t1.Minutes > 0) ? 1 : 0);

            int[] paydays = new int[2];

            paydays[0] = days / 7;
            paydays[1] = days % 7;
            if (paydays[1] >= 4)
            {
                paydays[0]++;
                paydays[1] = 0;
            }

            return paydays;
        }
    }
}
